#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
深度语音合成项目主程序
负责程序初始化和启动
"""

import sys
import os
import logging
import ssl
from pathlib import Path
from PyQt5.QtWidgets import QApplication, QMessageBox

# 添加项目根目录到路径
BASE_DIR = Path(__file__).resolve().parent
sys.path.append(str(BASE_DIR))

# 导入项目模块
from config.paths import create_directories, NLTK_DATA_DIR
from core.model_manager import ModelManager
from gui import MainWindow

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger("主程序")

# 配置 NLTK 数据路径
def configure_nltk():
    try:
        import nltk
        # 只使用项目内的NLTK数据目录
        os.environ['NLTK_DATA'] = str(NLTK_DATA_DIR)
        
        # 重新配置 nltk 数据路径，只使用项目内目录
        nltk.data.path = []  # 清空当前路径
        nltk.data.path.append(str(NLTK_DATA_DIR))  # 只使用项目内目录
        
        # 修复macOS SSL证书问题
        try:
            _create_unverified_https_context = ssl._create_unverified_context
        except AttributeError:
            pass
        else:
            ssl._create_default_https_context = _create_unverified_https_context
            logger.info("已设置SSL证书验证绕过，以解决macOS证书问题")
        
        logger.info(f"NLTK数据路径: {nltk.data.path}")
    except ImportError:
        logger.warning("NLTK未安装，某些文本处理功能可能不可用")

def download_dependencies():
    """下载必要的依赖数据"""
    model_manager = ModelManager()
    
    # 创建应用，确保QMessageBox可以显示
    if not QApplication.instance():
        app = QApplication([])
    
    # 检查并下载NLTK数据
    punkt_dir = NLTK_DATA_DIR / "tokenizers" / "punkt"
    punkt_file1 = punkt_dir / "english.pickle" 
    punkt_file2 = punkt_dir / "PY3" / "english.pickle"
    
    if not punkt_dir.exists() or (not punkt_file1.exists() and not punkt_file2.exists()):
        reply = QMessageBox.question(
            None, 
            "下载提示", 
            "需要下载语音合成所需的数据文件，是否现在下载？",
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.Yes
        )
        
        if reply == QMessageBox.Yes:
            logger.info("开始下载必要的依赖数据...")
            try:
                # 先尝试下载NLTK数据
                import nltk
                nltk.download('punkt', download_dir=str(NLTK_DATA_DIR))
                nltk.download('averaged_perceptron_tagger', download_dir=str(NLTK_DATA_DIR))
                
                # 再下载模型
                success = model_manager.download_dependencies()
                if success:
                    QMessageBox.information(None, "下载完成", "数据文件下载完成！")
                else:
                    QMessageBox.warning(
                        None, 
                        "下载警告", 
                        "部分数据下载失败，某些功能可能不可用。\n请检查网络连接后重试。"
                    )
            except Exception as e:
                logger.error(f"下载数据时出错: {str(e)}")
                QMessageBox.critical(
                    None,
                    "下载错误",
                    f"下载数据时出错: {str(e)}\n请检查网络连接后重试。"
                )
    
    return model_manager

# 主程序入口
if __name__ == "__main__":
    # 确保必要的目录结构存在
    create_directories()
    
    # 配置 NLTK
    configure_nltk()
    
    # 创建应用程序
    app = QApplication(sys.argv)
    
    # 下载必要的依赖数据
    download_dependencies()
    
    # 创建并显示主窗口
    window = MainWindow()
    window.show()
    
    # 进入应用程序主循环
    sys.exit(app.exec_()) 